package main

import (
	"chatroom/common/message"
	"chatroom/server/process"
	"chatroom/server/utils"
	"fmt"
	"io"
	"net"
)

// Processor 的结构体
type Processor struct {
	Conn net.Conn
}

// 根据客户端发送消息种类不同，决定调用哪个函数来处理
func (this *Processor) serverProcessMes(mes *message.Message) (err error) {
	// 接收到客户端发送的群发的消息
	fmt.Println("mes=", mes)
	switch mes.Type {
	case message.LoginMesType:
		// 处理登录
		// 创建一个 UserProcess 实例
		up := &process2.UserProcess{
			Conn: this.Conn,
		}
		err = up.ServerProcessLogin(mes)
	case message.RegisterMesType:
		// 处理注册
		up := &process2.UserProcess{
			Conn: this.Conn,
		}
		err = up.ServerProcessRegister(mes)
	case message.SmsMesType:
		// 创建一个 SmsProcess 实例
		smsProcess := &process2.SmsProcess{}
		// 完成转发群聊消息
		smsProcess.SendGroupMes(mes)
	default:
		fmt.Println("消息类型不存在，无法处理...")
	}
	return
}

// 消息总控处理
func (this *Processor) process2() (err error) {
	// 循环处理客户端发送的信息
	for {
		// 创建一个 Transfer 实例
		tf := &utils.Transfer{
			Conn: this.Conn,
		}
		// 读取数据包，封装成一个函数 readPkg(), 返回Message, Err
		mes, err := tf.ReadPkg()
		if err != nil {
			if err == io.EOF {
				fmt.Println("客户端退出，服务器端也退出...")
				return err
			} else {
				fmt.Println("readPkg err=", err)
				return err
			}
		}
		// 用于分发消息
		err = this.serverProcessMes(&mes)
		if err != nil {
			return err
		}
	}
}
